<!DOCTYPE html>
<html>

<head>
  <title>Vodafone Greece replaces Spring Boot with Quarkus</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/" />
  <meta property="og:title" content="Vodafone Greece replaces Spring Boot with Quarkus" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="post">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="active">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="post-page grid-wrapper">
  <div class="width-8-12 width-12-12-m doc-content">
    <div class="grid-wrapper">
      <div class="width-12-12">
        <p>
          <a href="/blog"><i class="fas fa-angle-left"></i> Back to all posts</a>
        </p>
      </div>
      <div class="width-12-12">
        <div class="post-date">
          November 13, 2019 
          
            <span class="tags"><a href="/blog/tag/user-story">#user-story</a></span>
          
        </div>
        <h1 class="post-title">Vodafone Greece replaces Spring Boot with Quarkus</h1>
        <div class="grid-wrapper">
          <div class="width-8-12 width-12-12-m byline-wrapper">
            
            
              <img class="headshot" src="https://www.gravatar.com/avatar/33c2cb775850e595c2dc1dedd88ef98d">
            
            <p class="byline">By Cesar Saavedra</p>
          </div>
          <div class="width-12-12">
              <div id="preamble">
<div class="sectionbody">
<div class="imageblock customer-logo">
<div class="content">
<img src="/assets/images/posts/quarkus-user-stories/vodafonegreece/New_VF_Logo_Horiz_RGB_RED.png" alt="Vodafone Greece logo" width="300">
</div>
</div>
<div class="paragraph">
<p>Vodafone Greece is the second largest telecommunications company in Greece providing fixed and wireless phone service to over 6M subscribers.</p>
</div>
<div class="paragraph">
<p>Vodafone Greece runs many applications on-premise and on the cloud so cloud resource consumption costs are extremely important to them. One component of their architecture is the Digital eXperience Layer (DXL), a Kubernetes-based software, which serves as a middleware between the Vodafone&#8217;s Core Systems (SOAP-based communication) and the clients (Web/Mobile) by providing an easily consumable REST API based on the TMF specification (<a href="https://www.tmforum.org/" class="bare">https://www.tmforum.org/</a>). Its goal is to become the backbone of Vodafone&#8217;s Digital Service for years to come. Its components leverage technologies such as MongoDB, Kafka Streams, and Redis to improve the responsiveness of older services by more than 800%, while at the same time transforming them to REST-friendly universal APIs. The DXL is implemented using Spring Boot and runs entirely on the cloud and they had been experiencing heavy memory resource consumption and long boot-up times, so they started to look for ways to reduce these.</p>
</div>
<div class="paragraph">
<p>Another key area of concern to Vodafone Greece was the long application start-up times, and although Vodafone Greece could have allocated more cloud resources to the DXL to improve boot-up times, this would have meant higher cloud costs. So they set out to find ways to optimize the DXL so that it would consume less cloud resources.</p>
</div>
<div class="paragraph">
<p>Beside the DXL, Vodafone Greece runs a large portion of their microservices using Spring Boot. At present, 80% of the microservices they run in development and production are based on Spring Boot but they also have 4 Node.js microservices in the mix.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="how-they-selected-quarkus"><a class="anchor" href="#how-they-selected-quarkus"></a>How they selected Quarkus</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The main criteria for their selection process to find a replacement for Spring Boot were developer efficiency, lower cloud resource consumption and shorter applications boot-up times. They considered the latter to be of great impact on cloud resource consumption costs as well as user experience improvement.</p>
</div>
<div class="paragraph">
<p>They looked and evaluated other technologies and frameworks, such as other natively-compilable frameworks, Node.js and Vert.x. They decided that Node.js would not be a good option for them because of the burden that they would put on their Java developers to learn and migrate Java applications to Javascript. Some frameworks didn’t make the cut either because of their desire for big solid backers and sponsors. Another native-compilable framework wasn’t selected because it would fail to compile the MongoDB driver - using the MongoDB driver in native mode was not supported at that time and there was no way to skip the portions of MongoDB driver that would not compile to native. They nearly selected Vert.x because of its excellent context propagation capabilities and its outstanding performance. However, when they learned about Quarkus in April of 2019, and that it included Vert.x in its stack and provided memory and start-up time optimizations, they decided to go with Quarkus. According to Christos Sotiriou, DXL technical lead at Vodafone Greece, Quarkus <em>“seemed to provide the performance boost we needed while at the same time having a good backer (Red Hat) and relying on battle-tested technologies”</em>. In June 2019, Vodafone Greece had its first successful microservices deployment that relied on a limited set of their rewritten common libraries in Quarkus.</p>
</div>
<div class="paragraph">
<p>Another reason Quarkus was selected over competing technologies was the ability for developers to write their own extensions. In addition, the project’s high activity characteristics, such as number of community members, project stars, quick turnaround to replies and fixes by Quarkus developers to community issues, and number of Red Hat developers thoroughly answering technical questions via the project communication channels were positive indicators for them to select Quarkus. Lastly, their trust of Red Hat combined with its credibility in the software market gave them the assurance that they were making the right choice by selecting Quarkus, whose sponsor is Red Hat.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-solution"><a class="anchor" href="#the-solution"></a>The solution</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Once they decided on the path forward, Vodafone Greece first started migrating their common internal libraries from Spring Boot to Quarkus. Their common libraries cover cross-cutting concerns, such as:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Logging</p>
</li>
<li>
<p>Security</p>
</li>
<li>
<p>DB connectivity</p>
</li>
<li>
<p>Kafka connectivity</p>
</li>
<li>
<p>Distributed logging</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>According to Christos, <em>“implementing distributed logging would have been very difficult to accomplish with Spring Boot, whereas with Quarkus, creating this new common library was viable and feasible. The methodology of setting up header propagation and perform actions on a microservice’s inbound-outbound requests in Quarkus allows for better reusability compared to Spring Boot, at least in our use cases, and allowed us to have a simpler setup for this for our cross-country team”</em>.</p>
</div>
<div class="paragraph">
<p>As of today, they have about 15 Quarkus microservices, 5 of which went into production at the end of September 2019. With respect to effort, 2 developers were dedicated to work on these first 5 microservices that are now in production running in JVM mode. Presently, their team is working on delivering 20 microservices in the next 3 months. It is worth mentioning that, in their experience, it was very easy for their Spring developers to pick up the Quarkus Java stack because <em>“migrating from Spring Boot to a CDI-based framework didn’t require a lot of effort”</em>, as per Christos.</p>
</div>
<div class="paragraph">
<p>Although Quarkus includes Spring API compatibility, Vodafone Greece has no plans to use it because <em>“it doesn’t make sense to mix the two programming models in a microservice”</em> according to Christos. In order to keep the code clean, Vodafone Greece is <em>“using only Quarkus constructs without muddying the waters with Spring syntax”</em> as specified by Christos. For their requirements, the Quarkus stack already offers everything they need, so there is no need for any Spring Boot at all.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-benefits"><a class="anchor" href="#the-benefits"></a>The benefits</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Vodafone Greece has seen many benefits using Quarkus. One of them is that memory resource consumption was cut in half in JVM mode. In addition, start-up times have been reduced to almost a quarter without any optimization. It is worth mentioning that many of these microservices are complex in that they <em>“have a lot of Kafka and database connections”</em> as described by Christos.</p>
</div>
<div class="paragraph">
<p>Their logging system, which uses Kafka, utilizes a lot of memory because it handles messages that are large in size and transforms them to JSON. As an example, some microservices required 1 GB of RAM when using Spring Boot. In comparison, for production they can now deploy a Quarkus microservice with 512 MB of RAM. <em>“For 80 microservices, this is big savings!”</em> Christos emphasized and added that <em>“what Quarkus offers by default (without trying to optimize it) is 50%-60% more lightweight (in JVM mode) that what Spring offers after optimizations (taking care of dependencies, playing with JVM options, etc)”</em>. With respect to start-up time, a significant portion of it is spent waiting for message brokers and databases to accept connections, which was making Spring Boot microservices boot up in about 50 seconds. But with Quarkus microservices, boot up in less than a quarter of that time (14 seconds).</p>
</div>
<div class="paragraph">
<p>The large magnitude of the developer efficiency benefit they experienced was unexpected and a pleasant surprise. First, they realized that migrating from Spring Boot to a CDI-based framework didn’t require a lot of effort for their Spring developers, resulting in a small learning curve. Second, the use of the Quarkus live coding capability (a.k.a. dev mode) resulted in an increase of developer productivity, which Christos described as <em>“a very good thing to have”</em>. For example, each development cycle consists of 1 to 2 sprints (1 sprint = 2-week period) depending on the complexity of the logic being developed, and with Quarkus they saw a <em>“30 to 40% better developer productivity vis-a-vis Spring Boot, and this is for an ex-Spring Boot developer”</em>, according to Christos.</p>
</div>
<div class="paragraph">
<p>Another Quarkus feature that impressed them was the effectiveness of the way Quarkus uses enterprise Java, e.g. the concise way to use CDI in combination with context propagation for asynchronous methods. It’s not uncommon for a microservice to make calls to other microservices to then aggregate the returned information by other microservices and this worked with Quarkus effortlessly, via the MicroProfile Context Propagation and MicroProfile Reactive Messaging extensions. In fact, <em>“MicroProfile is a good reason why we like Quarkus as a development tool”</em> stated Christos.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="whats-next"><a class="anchor" href="#whats-next"></a>What&#8217;s next</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As far as next steps, the number of microservices Vodafone Greece has now only covers a small fraction of what they intend to do. They want to double what they have now, in other words, double the number of microservices and the number of developers dedicated to this initiative. To this end, they plan to release 20 Quarkus microservices in the next three months. According to Christos, as they grow, <em>“orchestration and developer productivity will become even more important for the resources they consume”</em>.</p>
</div>
<div class="paragraph">
<p>Presently, they run Quarkus in JVM mode when interfacing to MongoDB but they are considering using native compilation with MongoDB in the future. When Vodafone Greece started using Quarkus a few months ago, it didn’t include an extension for MongoDB but Quarkus does include a MongoDB client extension now that they could leverage. In addition, they plan to use more Quarkus extensions, like circuit breakers from MicroProfile Fault Tolerance, and more broadly adopt MicroProfile reactive messaging specifications.</p>
</div>
<div class="paragraph">
<p>Furthermore, notwithstanding that with Quarkus, they have already cut their memory consumption and start-up times in more than half running it in JVM mode, they plan to run their Quarkus microservices in native mode in the future to get even better memory consumption and start-up times.</p>
</div>
<div class="paragraph">
<p>For more information on Quarkus:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Quarkus website: <a href="http://quarkus.io" class="bare">http://quarkus.io</a></p>
</li>
<li>
<p>Quarkus GitHub project: <a href="https://github.com/quarkusio/quarkus" class="bare">https://github.com/quarkusio/quarkus</a></p>
</li>
<li>
<p>Quarkus Twitter: <a href="https://twitter.com/QuarkusIO" class="bare">https://twitter.com/QuarkusIO</a></p>
</li>
<li>
<p>Quarkus chat: <a href="https://quarkusio.zulipchat.com/" class="bare">https://quarkusio.zulipchat.com/</a></p>
</li>
<li>
<p>Quarkus mailing list: <a href="https://groups.google.com/forum/#!forum/quarkus-dev" class="bare">https://groups.google.com/forum/#!forum/quarkus-dev</a></p>
</li>
<li>
<p><a href="https://www.redhat.com/cms/managed-files/cl-4-reasons-try-quarkus-checklist-f19180cs-201909-en.pdf">Four reasons to use Quarkus</a></p>
</li>
</ul>
</div>
</div>
</div>
              
          </div>
          <div class="width-12-12"><div class="share-page">
  <a class="share-linkedin" href="https://www.linkedin.com/shareArticle?mini=true&url=https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/&title=Vodafone Greece replaces Spring Boot with Quarkus" rel="nofollow" target="_blank" title="Share on LinkedIn">
    <img src="/assets/images/share-page/icons_social-linkedin.png"/>
  </a>
  <a class="share-twitter" href="https://twitter.com/intent/tweet?text=Vodafone Greece replaces Spring Boot with Quarkus&url=https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/&via=quarkusio&related=quarkusio" rel="nofollow" target="_blank" title="Share on Twitter">
    <img src="/assets/images/share-page/icons_social-twitter.png"/>
  </a>
  <a class="share-facebook" href="https://facebook.com/sharer.php?u=https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/" rel="nofollow" target="_blank" title="Share on Facebook">
    <img src="/assets/images/share-page/icons_social-facebook.png"/>
  </a>
  <a class="share-reddit" href="http://www.reddit.com/submit?url=https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/" onclick="window.open(this.href, 'pop-up', 'left=20,top=20,width=900,height=500,toolbar=1,resizable=0'); return false;" title="Share on Reddit" >
    <img src="/assets/images/share-page/icons_social-reddit.png"/>
  </a>
  <a class="share-email" href="mailto:?subject=Vodafone Greece replaces Spring Boot with Quarkus&amp;body=Vodafone Greece replaces Spring Boot with Quarkus https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/" title="Share via Email" >
    <img src="/assets/images/share-page/icons_social-email.png"/>
  </a>
</div>
</div>
        </div>
      </div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
